//
// Created by Administrator on 2023/11/18.
//
#include "iostream"
using namespace std;

const int N = 1010;
int dp[N][N];
int v[N],w[N];

int main(){
    int n,m;
    cin>>n>>m;
    for(int i = 1 ; i <= n ;i ++)
        cin>>v[i]>>w[i];
    //i表示物品
    for(int i = 1 ; i<=n ;i++)
        for(int j = 0 ; j<=m ;j++)
            //相比0-1背包问题，少了一个装不装的问题，多了一个装多少件的问题
            for(int k = 0 ; k*v[i]<=j ; k++)
                dp[i][j] = max(dp[i][j],dp[i-1][j-k*v[i]]+k*w[i]);

    /*【优化】
     * f[i][j] = max(f[i - 1][j]  ,  f[i - 1][j - v] + w  ,  f[i - 1][j - 2 × v] + 2 × w  ,  f[i - 1][j - 3 × v] + 3 × w , .....)
     * f[i][j - v] = max(f[i - 1][j - v],f[i - 1][j - 2 × v] + w,f[i - 1][j - 3 × v] + 2 × w  ,  f[i - 1][j - 4 × v] + 3 × w , .....)
     *
     *
     * */

    cout<<dp[n][m];
}